home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / mint / mint96sb.zoo / doc / xkey.c < prev   
C/C++ Source or Header  |  1992-03-15  |  2KB  |  142 lines

  1. #include <stdio.h>
  2. #include <ioctl.h>
  3. #include <string.h>
  4.  
  5. #define MAXKEY 32
  6. #ifndef TIOCGXKEY
  7. #define TIOCGXKEY    (('T'<< 8) | 13)
  8. #define TIOCSXKEY    (('T'<< 8) | 14)
  9. #endif
  10.  
  11. struct xkey {
  12.     short xk_num;
  13.     char xk_def[8];
  14. } xk;
  15.  
  16. char *kname[MAXKEY] = {
  17. "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10",
  18. "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10",
  19. "up", "down", "right", "left", "help", "undo", "insert", "home",
  20. "UP", "DOWN", "RIGHT", "LEFT"
  21. };
  22.  
  23. char buf[80];
  24.  
  25. char *unescape(char *string)
  26. {
  27.     char *u = buf;
  28.     char c;
  29.  
  30.     while (c = *string++) {
  31.         if (c == '\\') {
  32.             c = *string++;
  33.             if (!c) break;
  34.         }
  35.         else if (c == '^') {
  36.             c = *string++;
  37.             if (!c) break;
  38.             else if (c == '?') c = 127;
  39.             else c &= 0x1f;
  40.         }
  41.         *u++ = c;
  42.     }
  43.     *u++ = 0;
  44.     return buf;
  45. }
  46.  
  47. char *escape(char *string)
  48. {
  49.     char *e, c;
  50.  
  51.     e = buf;
  52.     while ( c = *string++ ) {
  53.         if (c < ' ' && c > 0) {
  54.             *e++ = '^';
  55.             c += '@';
  56.         }
  57.         else if (c == 127) {
  58.             *e++ = '^';
  59.             c = '?';
  60.         }
  61.         else if (c == '\\' || c == '^')
  62.             *e++ = '\\';
  63.         *e++ = c;
  64.     }
  65.     *e++ = 0;
  66.     return buf;
  67. }
  68.  
  69. void
  70. displaykeys()
  71. {
  72.     int i, r;
  73.     int col = 0, maxcol;
  74.     char *e;
  75.  
  76.     maxcol = 80;        /* really should do ioctl to get this */
  77.     for (i = 0; i < MAXKEY; i++) {
  78.         xk.xk_num = i;
  79.         r = ioctl(0, TIOCGXKEY, &xk);
  80.         if (r) {
  81.             perror("ioctl");
  82.             exit(1);
  83.         }
  84.         e = escape(xk.xk_def);
  85.         col += (r = strlen(kname[i]) + strlen(e) + 2);
  86.         if (col >= maxcol) {
  87.             printf("\n");
  88.             col = r;
  89.         }
  90.         printf("%s %s ", kname[i], e);
  91.     }
  92.     printf("\n");
  93. }
  94.  
  95. void
  96. definekey(char *key, char *def)
  97. {
  98.     int i;
  99.  
  100.     for (i = 0; i < MAXKEY; i++)
  101.         if (!strcmp(kname[i], key)) break;
  102.     if (i >= MAXKEY) {
  103.         fprintf(stderr, "Unknown key: %s\n", key);
  104.         return;
  105.     }
  106.     strncpy(xk.xk_def, unescape(def), 7);
  107.     xk.xk_num = i;
  108.     xk.xk_def[7] = 0;
  109.     i = ioctl(0, TIOCSXKEY, &xk);
  110.     if (i) {
  111.         perror("ioctl");
  112.     }
  113. }
  114.  
  115. int
  116. main(int argc, char **argv)
  117. {
  118.     char *progname;
  119.     char *key, *def;
  120.  
  121.     progname = *argv++;
  122.  
  123.     if (!isatty(0)) {
  124.         fprintf(stderr, "%s must be run on a terminal\n", progname);
  125.         return 1;
  126.     }
  127.     if (!*argv) {
  128.         displaykeys();
  129.         return 0;
  130.     }
  131.     while (*argv) {
  132.         key = *argv++;
  133.         def = *argv++;
  134.         if (!def) {
  135.             fprintf(stderr, "Usage: %s [key def]...\n", progname);
  136.             return 2;
  137.         }
  138.         definekey(key, def);
  139.     }
  140.     return 0;
  141. }
  142.